import tkinter as tk
from PIL import Image, ImageTk
from pynput import keyboard
import os
import sys
from pathlib import Path

def get_resource_path(relative_path):
    """获取资源文件的绝对路径，兼容打包后的exe"""
    try:
        # PyInstaller 打包后的临时文件夹
        base_path = sys._MEIPASS
    except Exception:
        # 开发环境下使用当前文件所在目录
        base_path = os.path.dirname(os.path.abspath(__file__))
    
    return os.path.join(base_path, relative_path)

class ImageDisplayApp:
    def __init__(self, root):
        self.root = root
        self.root.title("QQ堂键盘显示 - 直播专用")  # 明确的窗口标题
        
        # 素材路径（兼容打包后的exe）
        self.image_folder = Path(get_resource_path("毛毛"))
        
        # 图片映射
        self.image_map = {
            'up': '上.png',
            'down': '下.png',
            'left': '左.png',
            'right': '右.png',
            'space': '空格.png',
            'idle': '静默.png'
        }
        
        # 预加载所有图片
        self.images = {}
        self.photo_images = {}
        self.load_images()
        
        # 设置窗口属性（保留边框，方便直播软件识别）
        self.root.attributes('-topmost', True)  # 置顶
        self.root.config(bg='#00FF00')  # 绿色背景，方便在OBS中抠像
        
        # 创建显示标签 - 使用 pack 填充，支持缩放
        self.label = tk.Label(self.root, bg='#00FF00', bd=0, highlightthickness=0)
        self.label.pack(fill=tk.BOTH, expand=True)
        
        # 显示初始图片（静默）
        self.current_state = 'idle'
        self.current_image = None
        self.update_image('idle')
        
        # 设置窗口属性 - 允许调整大小
        self.root.resizable(True, True)
        
        # 绑定窗口大小改变事件
        self.root.bind('<Configure>', self.on_window_resize)
        
        # 绑定关闭事件
        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)
        
        # 启动键盘监听
        self.listener = keyboard.Listener(
            on_press=self.on_key_press,
            on_release=self.on_key_release)
        self.listener.start()
        
        # 按键状态
        self.pressed_keys = set()
        
        # 显示提示信息
        print("=" * 50)
        print("直播专用版本已启动")
        print("=" * 50)
        print("窗口标题: QQ堂键盘显示 - 直播专用")
        print("背景颜色: 绿色 (#00FF00)")
        print()
        print("OBS 设置方法:")
        print("1. 添加来源 → 窗口捕获")
        print("2. 选择窗口: [键盘显示.exe]: QQ堂键盘显示 - 直播专用")
        print("3. 添加滤镜 → 色度键")
        print("4. 选择绿色进行抠像，透明度设为0")
        print("=" * 50)
    
    def load_images(self):
        """预加载所有图片（原始尺寸）"""
        first_image = None
        for key, filename in self.image_map.items():
            image_path = self.image_folder / filename
            if image_path.exists():
                img = Image.open(image_path)
                self.images[key] = img
                if first_image is None:
                    first_image = img
        
        # 根据第一张图片设置初始窗口大小（放大2倍或至少400x400）
        if first_image:
            width = max(first_image.width * 2, 400)
            height = max(first_image.height * 2, 400)
            self.root.geometry(f"{width}x{height}")
            # 设置最小窗口大小
            self.root.minsize(200, 200)
    
    def update_image(self, state):
        """更新显示的图片（自动缩放到窗口大小）"""
        if state in self.images:
            self.current_state = state
            self.current_image = state
            self.resize_and_display()
    
    def resize_and_display(self):
        """根据窗口大小缩放并显示图片"""
        if self.current_image and self.current_image in self.images:
            # 获取窗口大小
            window_width = self.root.winfo_width()
            window_height = self.root.winfo_height()
            
            # 如果窗口还没有显示，使用默认大小
            if window_width <= 1 or window_height <= 1:
                return
            
            # 获取原始图片
            original_image = self.images[self.current_image]
            
            # 计算缩放比例（保持纵横比）
            img_width, img_height = original_image.size
            width_ratio = window_width / img_width
            height_ratio = window_height / img_height
            scale_ratio = min(width_ratio, height_ratio)
            
            # 计算新尺寸
            new_width = int(img_width * scale_ratio)
            new_height = int(img_height * scale_ratio)
            
            # 缩放图片（使用高质量的 LANCZOS 算法）
            resized_image = original_image.resize((new_width, new_height), Image.Resampling.LANCZOS)
            
            # 更新显示
            photo = ImageTk.PhotoImage(resized_image)
            self.label.config(image=photo)
            self.label.image = photo  # 保持引用，防止被垃圾回收
    
    def on_window_resize(self, event):
        """窗口大小改变时的回调"""
        # 只响应窗口本身的大小改变，不响应其他控件
        if event.widget == self.root:
            self.resize_and_display()
    
    def on_key_press(self, key):
        """键盘按下事件"""
        try:
            # 调试信息
            print(f"按键检测: {key}")
            
            # 方向键处理
            if key == keyboard.Key.up:
                self.pressed_keys.add('up')
                self.root.after(0, lambda: self.update_image('up'))
            elif key == keyboard.Key.down:
                self.pressed_keys.add('down')
                self.root.after(0, lambda: self.update_image('down'))
            elif key == keyboard.Key.left:
                self.pressed_keys.add('left')
                self.root.after(0, lambda: self.update_image('left'))
            elif key == keyboard.Key.right:
                self.pressed_keys.add('right')
                self.root.after(0, lambda: self.update_image('right'))
            elif key == keyboard.Key.space:
                self.pressed_keys.add('space')
                self.root.after(0, lambda: self.update_image('space'))
        except AttributeError:
            pass
    
    def on_key_release(self, key):
        """键盘释放事件"""
        try:
            # 移除按键状态
            if key == keyboard.Key.up:
                self.pressed_keys.discard('up')
            elif key == keyboard.Key.down:
                self.pressed_keys.discard('down')
            elif key == keyboard.Key.left:
                self.pressed_keys.discard('left')
            elif key == keyboard.Key.right:
                self.pressed_keys.discard('right')
            elif key == keyboard.Key.space:
                self.pressed_keys.discard('space')
            
            # 如果没有按键被按下，恢复静默状态
            if not self.pressed_keys:
                self.root.after(0, lambda: self.update_image('idle'))
        except AttributeError:
            pass
    
    def on_closing(self):
        """关闭窗口时停止监听"""
        self.listener.stop()
        self.root.destroy()

def main():
    root = tk.Tk()
    app = ImageDisplayApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()
